home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programmer's Power Pack / Delphi Volume 1.iso / e_to_l / edchklst / edchklst.pas < prev    next >
Pascal/Delphi Source File  |  1996-09-15  |  9KB  |  224 lines

  1. unit EdChkLst;
  2.  
  3. { TEditCheckList V 1.0
  4.   (c) Olivier Dahan March, 23th 1996
  5.  
  6.   This component is a TCustomEdit child. It not allows text input but
  7.   posess an Items (TString) property where to stock all "legal" values, like
  8.   a Combobox.
  9.   The main difference with a Combo is the way the values are used.
  10.   In the TEditCheckList the user can use Up and Down Arrows to directly
  11.   get access to all values and he/she can type characters used as an incremental
  12.   search seed. By example, if the Items property contains "July/Juliet" and
  13.   if "J" is typed, the control displays "July" (the first corresponding). If
  14.   the user enters "U" and "L", the control stays on "July", and if he/she next
  15.   types "I", the controls displays "Juliet".
  16.   The typed characters remain in the control memory until arrows are used or
  17.   "escape" key is entered.
  18.   The control shows, as a selection, the number of typed characters. In our
  19.   example (July/Juliet), at the end of the sequence, Juliet is displays and
  20.   "juli" are shown as a selection. This is a good visual way to show the
  21.   silent incremental search text.
  22.   When an entry is found in the list of values, the OnFound events is
  23.   fired. So, you can connect here some code to hold this special condition.
  24.   The OnFound event return the sender, the found item (text and index in
  25.   the Items property) and the incremental search text.
  26.  
  27.   Used keys are:
  28.   * Up and Down arrows        to navigate throught the list of values
  29.   * 'A'..'Z','0'..'9'         add a character to incremental search text
  30.                               (case insensitive)
  31.   * Escape                    blanks the incremental search text
  32.                               No display change (but no visible selection).
  33.   * Back                      Erases last character of incremental search text
  34.  
  35.   TEditCheckList is not intented to be used as a text input control. Its
  36.   creator switches the ReadOnly propery to true. Its a Tedit sibling but
  37.   it acts more like a ComboBox.
  38.  
  39. Legal stuff
  40. -----------
  41. Copyright:     This software is copyrighted by Olivier Dahan, Paris, France
  42.                CIS 100531,163
  43. Use:           This software is distributed as Freeware, that means you can
  44.                use it with no charge in any application, ONLY IF YOU REGISTER.
  45.                Registration is FREE but you must send a message saying you're
  46.                using the component to Olivier Dahan CIS 100531,163.
  47.                DO IT ! You'll sleep better and you'll encourage source code
  48.                distribution.
  49. Limitation:    You can't sell this software (but a minimal distribution fee)
  50.                without author permission.
  51.                If you distribute it, you must include all original files.
  52. Changes:       You can change this component but, in this case, you must give
  53.                your version a specific name (not TeditCheckList).
  54.                You can send a copy to the author (myself) he will be very
  55.                pleased...
  56.  
  57.  
  58. --------------------
  59. The Legal Disclaimer
  60. --------------------
  61. THE INFORMATION AND CODE PROVIDED HEREUNDER (COLLECTIVELY REFERRED TO AS
  62. "SOFTWARE") IS PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
  63. OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  64. MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
  65. OLIVIER DAHAN BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT,
  66. INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN
  67. IF OLIVIER DAHAN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME
  68. STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR
  69. CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT
  70. APPLY. IN SUCH CASES, THE FOLLOWING LEGAL DISCLAIMER WILL APPLY:
  71. FOR FRANCE (and all countries not allowing exclusion or limitation of
  72. liability for consequential or incidental damages):
  73. LE PRESENT LOGICIEL EST MIS GRACIEUSEMENT A DISPOSITON SUR LE FORUM DELPHI DE
  74. LA SOCIETE BORLAND SUR COMPUSERVE UNIQUEMENT A TITRE D'EXEMPLE. IL EST DESTINE
  75. AUX PROFESSIONNELS INFORMATICIENS QUI FREQUENTENT CE FORUM. SEULS CES PERSONNES
  76. SONT AUTORISEES A FAIRE USAGE DU PRESENT LOGICIEL ET CE, SOUS LEUR SEULE ET
  77. UNIQUE RESPONSABILITE D'INFORMATICIEN PROFESSIONNEL. SI VOUS NE COMPRENEZ PAS
  78. LE CODE SOURCE DU PRESENT LOGICIEL ET N'AVEZ PAS LES COMPETENCES POUR LE
  79. CORRIGER (en cas de bug), NE L'UTILISEZ PAS !
  80. }
  81.  
  82.  
  83. interface
  84.  
  85. uses
  86.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  87.   Forms, Dialogs, stdctrls;
  88.  
  89.  
  90. Type
  91. TSelectionFound = Procedure(Sender:Tobject;const TypedText,Foundtext:String;
  92.                             ItemIndex:Longint) of object;
  93.  
  94. TEditCheckList = Class (TCustomEdit)
  95.                  Protected
  96.                  fItems : TStringList;
  97.                  fitemindex : longint;
  98.                  ftempStr : string;
  99.                  FOnFound : TSelectionFound;
  100.                  procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  101.                  Function Traitekey(var Key: Word; Shift: TShiftState):boolean;
  102.                  Private
  103.                  Procedure SetItems(value:TStringList);
  104.                  procedure SetItemIndex(value:Longint);
  105.                  procedure SetTStr(value:string);
  106.                  property TStr:String read FtempStr Write SetTStr;
  107.                  procedure SynchroText;
  108.                  Public
  109.                  Constructor Create(Aowner:Tcomponent); override;
  110.                  Destructor Destroy; override;
  111.                  Published
  112.                  property OnFound:TSelectionFound Read FonFound Write FOnFound;
  113.                  Property Items : TstringList Read fItems Write SetItems;
  114.                  property text;
  115.                  property ItemIndex : Longint Read FitemIndex Write SetItemIndex;
  116.                  property Borderstyle;
  117.                  property color;
  118.                  property ctl3d;
  119.                  property font;
  120.                  property hideselection;
  121.                  property showhint;
  122.                  property hint;
  123.                  property Onchange;
  124.                  property onclick;
  125.                  property OnDblClick;
  126.                  property OnEnter;
  127.                  Property OnExit;
  128.                  Property OnKeyDown;
  129.                  Property OnKeyUp;
  130.                  Property OnMouseDown;
  131.                  Property OnMouseMove;
  132.                  Property OnMouseUp;
  133.                  end;
  134.  
  135.  
  136. Procedure register;
  137.  
  138. implementation
  139.  
  140. Constructor TEditCheckList.Create;
  141. begin
  142. Inherited Create(Aowner);
  143. Parent:=AOwner as TWinControl;
  144. FItems := TStringList.Create;
  145. Fitems.sorted:=true;
  146. fItemIndex:=-1;
  147. FTempStr:='';
  148. readonly:=true;
  149. end;
  150.  
  151. Destructor TEditCheckList.Destroy;
  152. begin
  153. Fitems.Free;
  154. Inherited Destroy;
  155. end;
  156.  
  157. Procedure TEditCheckList.SetItems;
  158. begin
  159. Fitems.Assign(Value);
  160. end;
  161.  
  162. procedure TEditCheckList.KeyUp(var Key: Word; Shift: TShiftState);
  163. begin
  164. if not traiteKey(key,shift) then Inherited KeyUp(key,shift);
  165. end;
  166.  
  167. Function TeditCheckList.TraiteKey;
  168. begin
  169. if Key=Vk_Up then begin ItemIndex:=ItemIndex-1; key:=0; FtempStr:=''; end;
  170. if key=Vk_Down then begin ItemIndex:=ItemIndex+1; key:=0; FtempStr:=''; end;
  171. if ((key>=ord('A')) and (key<=ord('Z'))) or (key=vk_space) or
  172.    ((key>=ord('0')) and (key<=ord('9'))) then begin Tstr:=Tstr+char(key);
  173.                                             key:=0;
  174.                                       end;
  175. if ((key=vk_back) and (Tstr<>'')) then begin tstr:=copy(tstr,1,length(tstr)-1);
  176.                                             key:=0;
  177.                                       end;
  178. if (key=vk_escape) then begin FtempStr:=''; key:=0; sellength:=0; end;
  179. end;
  180.  
  181. Procedure TeditCheckList.SetItemIndex;
  182. begin
  183. if 
  184.    (value>-2) and
  185.    (value<Fitems.count) then begin FitemIndex:=Value;
  186.                                    SynchroText;
  187.                              end;
  188. end;
  189.  
  190. Procedure TeditCheckList.SetTStr;
  191. var i,ii:longint; found:boolean;
  192. begin
  193. if (value<>FTempStr) then
  194.    begin
  195.    FtempStr:=value; found:=false;
  196.    for i:=0 to items.count-1 do
  197.        if Ftempstr=uppercase(copy(